<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JS&ES6</title>
</head>

<body>
    <div>
        JS&ES6
    </div>
    <script>
        // var m = new Map([['maciale', 97], ['maria', 98], ['Jane', 100]])
        // var s = new Set()
        // console.log(m.get("Jane"))

        // var a = ['A', 'B', 'C'];
        // var s = new Set(['A', 'B', 'C']);
        // var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
        // for (var x of a) { // 遍历Array
        //     console.log(x);
        // }
        // for (var x of s) { // 遍历Set
        //     console.log(x);
        // }
        // for (var x of m) { // 遍历Map
        //     console.log(x[0] + '=' + x[1]);
        // }

        // var a = ['A', 'B', 'C'];
        // a.name = 'Hello';
        // a.length = 7
        // for (var x in a) {
        //     console.log(x); // '0', '1', '2', 'name'
        // }

        // var a = ['A', 'B', 'C'];
        // a.name = 'Hello';
        // for (var x of a) {
        //     console.log(x); // 'A', 'B', 'C'
        // }

        // var a = ['A', 'B', 'C'];
        // a.forEach(function (element, index, array) {
        //     // element: 指向当前元素的值
        //     // index: 指向当前索引
        //     // array: 指向Array对象本身
        //     console.log(element + ', index = ' + index);  //  A, index = 0   //B, index = 1   // C, index = 2
        //     // console.log(array)
        // });
        // var count = 0;
        // var oldParseInt = parseInt; // 保存原函数
        // console.log(parseInt)
        // window.parseInt = function () {
        //     count += 1;
        //     return oldParseInt.apply(null, arguments); // 调用原函数
        // };
        // parseInt('10');
        // console.log(parseInt)
        // parseInt('20');
        // parseInt('30');
        // console.log('count = ' + count); // 3



        /* 高阶函数 map &reduce*/

        // function pow(x) {
        //     return x * x;
        // }
        // var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
        // var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
        // console.log(results);
        // var results2 = arr.map(String); //  ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
        // console.log(results2);

        // var arr = [1, 3, 5, 7, 9];
        // arr.reduce(function (x, y) {
        //     return x + y;
        // }); // 25
        // var arr2 = [1, 3, 5, 7, 9];
        // let result = arr2.reduce(function (x, y) {
        //     return x * y;
        // }); // 25
        // console.log(['adam', 'LISA', 'barT'].toString())
        // console.log(['Adam', 'Lisa', 'Bart'].toString())

        // filter 去重
        // var
        //     r,
        //     arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
        // r = arr.filter(function (element, index, self) {
        //     console.log(self.indexOf(element),index)
        //     return self.indexOf(element) === index;
        // });
        // console.log(r.toString());
        // function get_primes(arr) {
        //     return arr
        // }
        // var
        //     x,
        //     r,
        //     arr = [];
        // for (x = 1; x < 100; x++) {
        //     arr.push(x);
        // }
        // console.log(arr)
        // r = get_primes(arr);
        // console.log(r.toString())
        // if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {

        //     console.log('测试通过!');
        // } else {
        //     console.log('测试失败: ' + r.toString());
        // }

        // var arr = ['Google', 'apple2','apple12','apple3', 'Microsoft'];
        // arr.sort(function (s1, s2) {
        //     x1 = s1.toUpperCase();
        //     x2 = s2.toUpperCase();
        //     if (x1 < x2) {
        //         return -1;
        //     }
        //     if (x1 > x2) {
        //         return 1;
        //     }
        //     return 0;
        // }); // ['apple', 'Google', 'Microsoft']
        // console.log(arr)



        /闭包/
        // function create_counter(initial) {
        //     var x = initial || 0;
        //     return {
        //         inc: function () {
        //             x += 1;
        //             return x;
        //         }
        //     }
        // }
        // var c1 = create_counter(10);
        // c1.inc(); // 1 
        // console.log(c1.inc())
        // c1.inc(); // 2
        // console.log(c1.inc())
        // c1.inc(); // 3
        // console.log(c1.inc())

        // function make_pow(n) {
        //     return function (x) {
        //         console.log(n)
        //         return Math.pow(x, n);
        //     }
        // }
        // //在返回的对象中，实现了一个闭包，该闭包携带了局部变量x，并且，从外部代码根本无法访问到变量x。换句话说，闭包就是携带状态的函数，并且它的状态可以完全对外隐藏起来。

        // //闭包还可以把多参数的函数变成单参数的函数。例如，要计算xy可以用Math.pow(x, y)函数，不过考虑到经常计算x2或x3，我们可以利用闭包创建新的函数pow2和pow3：
        // // 创建两个新函数:
        // var pow2 = make_pow(2);
        // var pow3 = make_pow(3);
        // console.log(pow2)
        // console.log(pow2(5)); // 25
        // console.log(pow3(7)); // 343

        //generator 函数

        // 普通函数
        //   function fib(max){
        //       var a = 0,b=1,arr=[0,1]
        //       while(arr.length<max){
        //           [a,b]=[b,a+b]
        //           arr.push(b)
        //       }
        //       return arr

        //   }
        //   let ar = fib(10)
        //   console.log(ar)

        // function* foo(x) {
        // yield x + 1;
        // yield x + 2;
        // return x + 3;
        // }
        // let a = foo(5)
        // console.log(a.next())
        // console.log(a.next())
        // console.log(a.next())

        //     function* fib(max){
        //         var  n=0,a=0,b=1
        //         while(n<max){
        //             yield a;
        //             [a,b] = [b,a+b]
        //             n++
        //         }
        //         return 
        //     }
        //     var f = fib(5)
        //     for (var x of fib(10)) {
        //     console.log(x); // 依次输出0, 1, 1, 2, 3, ...
        // }
        // var a = new Date()
        // var d = new Date().getTime();
        // console.log(a)
        // // console.log(d.toLocaleString())
        // let c =  d-a.getTimezoneOffset()*60000
        // console.log(new Date(c))

        // RegExp
        // var re =/^\d{3}\-\d{3,8}$/
        // console.log(re.test('010-12345'))
        // console.log(re.test('010-%2345'))
        // console.log('a b  c'.split(/\s+/))
        // console.log('a b  c,d;e'.split(/[\s\,\;]+/))
        // var res = /^(\d{3})\-(\d{3,8})$/
        // console.log(res.exec('010-23456'))

        // window
        //         console.log('appName = ' + navigator.appName);
        // console.log('appVersion = ' + navigator.appVersion);
        // console.log('language = ' + navigator.language);
        // console.log('platform = ' + navigator.platform);
        // console.log('userAgent = ' + navigator.userAgent);
        // console.log('Screen size = ' + screen.width + ' x ' + screen.height);
    </script>
</body>

</html>